#ifndef LUMIERE_H
#define LUMIERE_H

#include "Noyau/Couleur.hpp"

#include "Algebre/Coord.hpp"

/**
 * Liste les différents type de sources lumineuses.
 */
enum EnumSource
  {
    srcAucune,     /**< Utilisé pour initialisation par défaut. */
    srcAmbiante,   /**< Source ambiante (pas d'origine). */
    srcPonctuelle, /**< Source ponctuelle sans atténuation. */
    srcAttenuee    /**< Source ponctuelle avec atténuation de
		      l'intensité en fonction de la distance. */
  };

/**
 * Classe de base pour tous les types de sources lumineuses
 * utilisées. Les seuls attributs de cette classe sont une Couleur et
 * le type de source.
 *
 * C'est une classe abstraite.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 2010
 */
class Lumiere
{
 public:
  Lumiere(const Couleur& coul = Couleur(), const EnumSource& type = srcAucune);
  virtual ~Lumiere();
  const EnumSource& typeSource() const;
  /**
   * Permet de récupérer la Couleur de la source lumineuse.
   *
   * @return une référence constante sur Color.
   */
  virtual const Couleur& color() const = 0;
  /**
   * Permet de récupérer la position de la source lumineuse.
   *
   * @return une référence constance sur la position de la Lumiere.
   */
  virtual const Coord& position() const = 0;
  /**
   * Permet de récupérer la valeur du coefficient d'atténuation de la
   * source lumineuse.
   *
   * @param pt point pour lequel on veut le coefficient d'atténuation
   * (qui peut dépendre de la position).
   * @return la valeur du coefficient d'atténuation.
   */
  virtual double attenuation(const Coord& pt) const = 0;
 protected:
  /**
   * La Couleur de la Lumiere.
   */
  Couleur Color;
  /**
   * Type de la source lumineuse.
   */
  EnumSource TypeSource;
};

#endif // LUMIERE_H
